package org.budo.ehcache.config.annotation;

import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

/**
 * EhCache 注解配置，接口实现类的方法上
 * 
 * @author lmw
 * @see org.budo.ehcache.config.annotation.factory.BudoEhcacheAnnotationConfigFactoryBean
 * @see org.budo.spring.cache.key.BudoSpringCacheKeyGenerator
 */
@Target({ METHOD })
@Retention(RUNTIME)
@Inherited
public @interface EhCacheConfig {
    /**
     * 缓存名，可从 @Cacheable 注解中读取
     * 
     * @deprecated 未使用
     */
    String name() default "";

    /**
     * 缓存最大个数
     */
    int maxElementsInMemory();

    /**
     * 缓存自最后一次访问时起的失效间隔时间
     */
    int timeToIdleSeconds();

    /**
     * 缓存自创建时起的失效间隔时间
     */
    int timeToLiveSeconds();

    /**
     * maxElementsInMemory达到时，将对象写到磁盘
     * 
     * @deprecated 未使用
     */
    boolean overflowToDisk() default false;

    /**
     * 磁盘缓存区大小
     * 
     * @deprecated 未使用
     */
    int diskSpoolBufferSizeMB() default 30;

    /**
     * 硬盘最大缓存个数
     */
    int maxElementsOnDisk() default 0;

    /**
     * 磁盘失效线程运行时间间隔
     * 
     * @deprecated 未使用
     */
    int diskExpiryThreadIntervalSeconds() default 120;

    /**
     * maxElementsInMemory达到时的清理策略
     * 
     * @deprecated 未使用
     */
    EvictionPolicy memoryStoreEvictionPolicy() default EvictionPolicy.LRU;

    /**
     * 是否持久化磁盘缓存
     * 
     * @deprecated 未使用
     */
    boolean diskPersistent() default false;

    /**
     * 对象是否永久有效
     * 
     * @deprecated 未使用
     */
    boolean eternal() default false;

    /**
     * 是否开启缓存统计，记录各种数据的总数
     */
    boolean statistics() default false;

    /**
     * 是否开启报表，记录每分钟各种数据的增量曲线
     */
    boolean graph() default false;

    /**
     * 缓存时间监听器工厂
     * 
     * @see net.sf.ehcache.event.CacheEventListenerFactory
     */
    Class<?> cacheEventListenerFactory() default void.class;
}